if 判断的几种用法

1.和文档相关的判断

        shell 脚本中 if 还经常判断关于档案属性,比如判断是普通文件还是目录,判断文件是否有读写执行权限等。常用的也就几个选项:

  • -e:判断文件或目录是否存在;
  • -d:判断是不是目录,并是否存在;
    -f:判断是否是普通文件,并存在;
  • -r:判断文档是否有读权限;
  • -w:判断文档是否有写权限;
  • -x:判断是否可执行。

        使用 if 判断时,具体格式为:

1
if [ -e filename ] ;then

        例子:

1
2
3
[root@192 sbin]# if [ -d /home/ ];then echo ok;fi
ok
[root@192 sbin]# if [ -f /home/ ];then echo ok;fi

        因为 /home/ 为目录非文件,所以 -f 并不会显示 “ok”。

1
2
3
4
5
6
7
8
9
[root@192 sbin]# if [ -f /home/1.txt ];then echo ok;fi
ok
[root@192 sbin]# if [ -r /home/1.txt ];then echo ok;fi
ok
[root@192 sbin]# if [ -w /home/1.txt ];then echo ok;fi
ok
[root@192 sbin]# if [ -x /home/1.txt ];then echo ok;fi
[root@192 sbin]# if [ -e /home/1.txt ];then echo ok;fi
ok

2.变量是否为空

        有时候需要判断一个变量的值是否为空,以避免后续操作产生异常。如果不去判断变量是否有值,就接着在后续命令中引用该变量,则会出错。比如下面脚本:

1
[root@192 sbin]# vim 3.sh

        加入内容:

1
2
3
4
5
6
#!/bin/bash
n=`wc -l 1.txt|awk '{print $1}'`
if [ $n -gt 10 ]
then
echo "The file 1.txt has more than 10 lines."
fi

        这个脚本看上去是没有问题,但没有考虑到 1.txt 文件不存在的情况,如果文件不存在,那么 n 的值也是不存在的。后面的判断也会出错。所以应该先判断一下 n 是否为空。

        使用下面方法即可:

1
[root@192 sbin]# vim 4.sh

        加入内容:

1
2
3
4
5
6
7
8
#!/bin/bash
a=
if [ -n "$a" ]
then
echo "a is not null."
else
echo "a is null."
fi

        -n 选项可以判断一个变量是否不为空,注意一定要把变量引起来,上例用双引号把 $a 引起来了,否则是不对的,还有一个和 -n 正好相对的, -z ,用法如下:

1
[root@192 sbin]# vim 5.sh

        加入内容:

1
2
3
4
5
6
#!/bin/bash
a=
if [ -z $a ]
then
echo "a is null."
fi

        这个 -z 后面的 $a 可以不用双引号引起来。

3.if 判断条件可以是一条命令

1
[root@192 sbin]# if grep -q '^yanyi:' /etc/passwd;then echo "user yanyi exist.";fi

        grep -p 选项的作用是,过滤但不输出。用在 if 判断中,不需要输出结果,只需要知道它到底有没有执行成功,也就是说如果 /etc/passwd 文件中含有 yanyi 这个用户,那么条件就成立了。